package com.example.emos.wx.aop;

import com.example.emos.wx.common.util.R;
import com.example.emos.wx.config.shiro.ThreadLocalToken;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @Author yctc
 * @Date 2021/3/9 14:02
 * @Version 1.0
 */
@Aspect
@Component
public class TokenAspect {
    @Autowired
    private ThreadLocalToken threadLocalToken;

    /**
     * 所有controller包中所有java类中的所有web方法都会被拦截
     * 拦截返回的 R 对象
     */
    @Pointcut("execution(public * com.example.emos.wx.controller.*.*(..)))")
    public void aspect() {

    }

    /**
     * 声明环绕事件
     */
    @Around("aspect()") //传入的参数就是给 上述切点方法加上通知事件
    public Object around(ProceedingJoinPoint point) throws Throwable {
        R r = (R) point.proceed();//获得拦截方法返回的结果->R对象
        String token = threadLocalToken.getToken();//检查有无新生成token
        if (token != null) {
            r.put("token", token);//token不为空,往R对象绑定token
            threadLocalToken.clear();//清空媒介类->ThreadLocalToken中绑定的数据
        }
        return r;
    }
}
